package br.com.service;

import java.util.List;

import javax.ejb.Stateless;

import br.com.bean.MessageBean;
import br.com.domain.Domain;
import br.com.domain.MenuItem;
import br.com.domain.PerfilMenu;
import br.com.domain.Usuario;
import br.com.exception.PersistenceException;
import br.com.exception.ServiceException;
import br.com.util.PropertiesUtil;
import br.com.util.SystemUtil;

/**********************************************************************************/
/** SOBRECARREGAR / CRIAR METODOS QUANDO NECESS�RIO REGRA DE NEG�CIO ADICIONAL   **/
/**********************************************************************************/

@Stateless
public class UsuarioService extends GenericServiceImpl  {
	
	/** SALVAR USUARIO **/
	@Override 
	public Usuario salvar(Domain usuario) throws ServiceException {
		try {
		
			Usuario user = (Usuario) usuario;
			
			/** VERIFICA SE J� EXISTE O USU�RIO **/
			Usuario userExistente = this.buscarLogin(user.getLogin());
			
			if (userExistente != null && usuario.getId() == null) {
				throw new ServiceException("Login Existente.");
			}
			
			/** SENHA DE COMFIRMAÇÃO NÃO CONFERE **/
			if(!isValidarSenhaDeConfirmacao(user.getSenha(), user.getSenhaConfirmar())){
				throw new ServiceException(PropertiesUtil.getMessageChave("page-usuario-cad-senha-validacao-msg"));
			}
			
			/** CRIPTOGRAFANDO SENHA **/
			user.setSenha(SystemUtil.getMD5(user.getSenha()));
			
			/** SALVAR **/
			super.salvar(user);	
			return user;			
		} catch (ServiceException e) {
			throw new ServiceException(e.getMessage());
		}
	}
	
	/** LOGAR USUARIO**/	
	public Usuario logarUsuario(String login, String senha) throws ServiceException {
		Usuario usuarioLogado = null;
		
		try {
			
			/** CAMPOS EM BRANCO **/
			if ("".equals(login) || "".equals(senha) ) {
				throw new ServiceException(PropertiesUtil.getMessageChave("page-login-mensagem-campo-obrigatorio"));
				
			}
			/** VALIDAR USUARIO - MD5 **/
			String senhaMD5 = SystemUtil.getMD5(senha);
		
			usuarioLogado = this.buscarUsuarioSenha(login, senhaMD5);
			
			/** USUÁRIO INVÁLIDO **/
			if (usuarioLogado == null ) {
				throw new ServiceException(PropertiesUtil.getMessageChave("page-login-mensagem-dados-incorretos"));
				
			}
			
		} catch (ServiceException e) {			
			throw new ServiceException(e.getMessage(), e);
		}
		
		return usuarioLogado;
	}
	
	/** TROCAR SENHA **/	
	public void salvarNovaSenha(Usuario usuarioLogado, String senhaAtualDigitada, String senhaConfirmar, String senhaNova) throws ServiceException {
		
		try {
			
			/** SENHA ATUAL EM BRANCO **/
			if (!isSenhaVazia(senhaAtualDigitada, senhaConfirmar, senhaNova)) {
				throw new ServiceException(PropertiesUtil.getMessageChave("page-login-mensagem-campo-obrigatorio"));
			}
			
			senhaAtualDigitada = SystemUtil.getMD5(senhaAtualDigitada);
			
			/** SENHA ATUAL NAO CONFERE **/
			if (!usuarioLogado.getSenha().equals(senhaAtualDigitada)) {
				throw new ServiceException(PropertiesUtil.getMessageChave("page-usuario-cad-senha-atual-senha"));
			}
			
			/** SENHA DE COMFIRMAÇÃO NÃO CONFERE **/
			if (!isValidarSenhaDeConfirmacao(senhaNova, senhaConfirmar)) {
				throw new ServiceException(PropertiesUtil.getMessageChave("page-usuario-cad-senha-validacao-msg"));
			}
			
			/** CRIPTOGRAFANDO SENHA **/
			usuarioLogado.setSenha(senhaNova);
			usuarioLogado.setSenhaConfirmar(senhaNova);
			usuarioLogado.setAlterarSenha(Boolean.FALSE);
					
			/** SALVANDO NOVA SENHA **/
			this.salvar(usuarioLogado);
			MessageBean.showInfoMessagePorChave("msg-info-operacao-sucesso");
		
		} catch (ServiceException e) {			
			throw new ServiceException(e.getMessage(), e);
		}
	}
	
	/** VERIFICA SE AS SENHAS ESTÂO PREENCHIDAS **/
	public Boolean isSenhaVazia(String valor1, String valor2, String valor3) {

		if (!SystemUtil.possuiDados(valor1) || !SystemUtil.possuiDados(valor2)
				|| !SystemUtil.possuiDados(valor3)) {
			return false;
		}
		return true;
	}
	
	/**VERIFICA SE A SENHA DE CONFIRMAÇÃO E IGUAL A NOVA SENHA  **/
	public Boolean isValidarSenhaDeConfirmacao(String valor1, String valor2) {

		if (!valor1.trim().equals(valor2)) {
			return false;
		}
		return true;
	}
	
	/** VALIDA AS SENHAS NA EDIÇÃO SE NÃO FOR PREENCHIDO, MANTEM A SENHA GRAVADA	**/ 
	public Usuario validarSenhaAoEditar(Usuario usuario) throws ServiceException {
		
		if(!SystemUtil.possuiDados(usuario.getSenha())){
			usuario.setSenha(usuario.getSenhaBanco());
			usuario.setSenhaConfirmar(usuario.getSenhaBanco());
		}
		
		return usuario;
	}
	
	/**REGRA PARA VERIFICAR SE TEM USUARIO NA SESSÂO E SE TEM QUE TROCAR A SENHA
	 * 
	 * @param usuario
	 * @return
	 */
	public Boolean existeUsuarioAndAlerarSenha(Usuario usuario){
		
		return SystemUtil.possuiDados(usuario) && 
				!usuario.getAlterarSenha();
	}
	
	/** BUSCAR POR USUARIO / SENHA **/
	public Usuario buscarUsuarioSenha(String usuario, String senha) throws ServiceException {
		Usuario retorno = null;
		
		try {
			
			String query    =  " SELECT u FROM Usuario u"               +
							   " WHERE  u.login = ?1 and u.senha = ?2"  ;
			
			retorno = (Usuario) genericDAO.executarQuerySingle(query, usuario, senha);
			
		} catch (PersistenceException e) {			
			throw new ServiceException(e.getMessage(), e);
		}
		
		return retorno;
	}
	
	
	/** BUSCAR POR USUARIO  **/
	public Usuario buscarLogin(String usuario) throws ServiceException {
		Usuario retorno = null;
		
		try {
			
			String query    =  " SELECT u FROM Usuario u"               +
							   " WHERE  u.login = ?1"  ;
			
			retorno = (Usuario) genericDAO.executarQuerySingle(query, usuario);
			
		} catch (PersistenceException e) {			
			throw new ServiceException(e.getMessage(), e);
		}
		
		return retorno;
	}
	
	/**************************************************************************/
	/**                         VALIDAR PERMISSOES                           **/
	/**************************************************************************/
	
	public PerfilMenu permissaoMenu(Usuario usuarioLogado, MenuItem menuItemClickado) throws ServiceException {
		
		 PerfilMenu retorno = null;	
			   
		 /** PERFIL MENU DO USUARIO LOGADO **/
		 List<PerfilMenu> listPerfilMenu = usuarioLogado.getPerfil().getListPerfilMenu();
		 
		 
			 for (PerfilMenu perfilMenu: listPerfilMenu) {
				   
				 Integer idMenuItemPerfil    = perfilMenu.getIdMenuItem();
				 Integer idMenuItemClickado  = menuItemClickado.getId();
				   
				 /** BUSCA NO PERFIL MENU DO USUARIO, O MENU ITEM CLICKADO **/
				 if (idMenuItemPerfil.equals(idMenuItemClickado)) {
					   
				    /** SE ACHOU **/
				    retorno =  perfilMenu;
				    break;
				  }
			  }
			
		  return retorno;		
	}
}
